package core.logic.dataAccess;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import core.logic.services.utilServices.ConnectionService;
import core.models.dataModels.createModels.ToevoegenVluchtModel;
import core.models.domainModel.Eigenaar;
import core.models.domainModel.Luchthaven;
import core.models.domainModel.Persoon;
import core.models.domainModel.Vliegtuig;
import core.models.domainModel.Vlucht;

public class VluchtenDAO {
	
	public static ArrayList<Vlucht> getAllBasic(Luchthaven x, Luchthaven y){
		ArrayList<Vlucht> lijst = new ArrayList<Vlucht>();
		String sql = "SELECT * FROM Vluchten WHERE vertrekLuchtHavenId = ? AND aankomstLuchtHavenId = ?";
		try{
			
			PreparedStatement prep= ConnectionService.getConnection().prepareStatement(sql);
			
			prep.setInt(1, x.getId());
			prep.setInt(2, y.getId());
			
			ResultSet rs = prep.executeQuery();
			
			while(rs.next()){
				
				Vlucht vl = new Vlucht(rs.getInt("VluchtId"), 
						null, 
						y ,  
						rs.getString("aankomstTijd"), 
						x, 
						rs.getString("vertrekTijd"), 
						rs.getDouble("prijsBusiness"), 
						rs.getDouble("prijsEconomy"), 
						"",
						rs.getString("VluchtNr"), 
						null, null, null); 
				lijst.add(vl);
			}
			
		}
		catch(SQLException ex){
			ex.printStackTrace();
		}
		return lijst;	 
	}
	
	public static ArrayList<String> getAllVluchtNr(){
		ArrayList<String> lijst = new ArrayList<String>();
		String sql = "SELECT DISTINCT VluchtNr from Vlucht";
		try{
			PreparedStatement prep = ConnectionService.getConnection().prepareStatement(sql);
			ResultSet rs = prep.executeQuery();
		
			while(rs.next()){
				lijst.add(rs.getString("VluchtNr"));
			}
		
		}
		catch(SQLException ex){
			ex.printStackTrace();
		}
		
		return lijst;
		
	}
		
	//Author Lieven Drijkoningen [C1017178] Toevoegen van een vlucht in het systeem
	//Aangepast : Bertels Nick c1019387
	public static int insertVlucht(ToevoegenVluchtModel m)
	{
		String sql = "INSERT INTO Vlucht(VliegtuigId, VertrekLuchthavenId, AankomstLuchthavenId,"
				+ " VluchtNr, VertrekTijd, AankomstTijd, PrijsEconomy, PrijsBusiness, Gate, VluchtStatus)"
				+ " VALUES (?,?,?,?,?,?,?,?,?,?)";

		int ok = 0;
		Connection con;
		

		try
		{
			con = ConnectionService.getConnection();
			
			PreparedStatement pst = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			
			pst.setInt(1,m.get_vliegtuig().get_vliegtuigID());	// int
			pst.setInt(2,m.get_luchthavenVertrek().getId());	// int
			pst.setInt(3,m.get_luchthavenAankomst().getId());	// int
			pst.setString(4,m.get_vluchtnr());					// varchar(45)
			pst.setString(5,m.get_vertrekTijd());				// varchar(45)
			pst.setString(6,m.get_aankomstTijd());				// varchar(45)
			pst.setDouble(7,m.get_prijsEcon());					// decimal(18,2)
			pst.setDouble(8,m.get_prijsBusiness());				// decimal(18,2)
			pst.setInt(9,m.get_gate());							// int
			pst.setString(10,m.get_status());					// varchar(3)
			
			ok = pst.executeUpdate();
			
			//ophalen van de gegenereerde id
			ResultSet rs = pst.getGeneratedKeys(); 
			rs.next();
			m.set_vluchtId(rs.getInt(1));
			
			pst.close();
		}
		catch (SQLException ex)
		{
			ex.printStackTrace();
			
		}
		
		return ok;
	}
	
	public static Vlucht getVluchtByVluchtId(int vluchtId) {
		Vlucht vlucht = null;
		Luchthaven vertrekLuchthaven = null;
		Luchthaven aankomstLuchthaven = null;
		Vliegtuig vliegtuig = null;
		Eigenaar eigenaar = null;
		Persoon persoon = null;
		
		String sql = "SELECT vl.VluchtNr AS VluchtNummer, "
				+      "vl.VertrekTijd AS VluchtVertrekTijd, "
				+      "vl.AankomstTijd AS VluchtAankomstTijd, "
				+      "vl.PrijsEconomy AS VluchtPrijsEconomy, "
				+      "vl.PrijsBusiness AS VluchtPrijsBusiness, "
				+      "vl.VluchtStatus AS VluchtStatus, "
				+      "vl.Gate AS VluchtGate, "
				+      "lu1.LuchthavenId AS VertrekLuchthavenId, "
				+      "lu1.LuchthavenCode AS VertrekLuchthavenCode, "
				+      "lu1.LuchthavenNaam AS VertrekLuchthavenNaam, "
				+      "lu2.LuchthavenId AS AankomstLuchthavenId, "
				+      "lu2.LuchthavenCode AS AankomstLuchthavenCode, "
				+      "lu2.LuchthavenNaam AS AankomstLuchthavenNaam, "
				+      "vli.VliegtuigId AS VliegtuigId, "
				+      "vli.Model AS VliegtuigModel, "
				+      "vli.Type AS VliegtuigType, "
				+      "vli.AantalPilotenNodig AS VliegtuigAantalPiloten, "
				+      "vli.AantalStewardsNodig AS VliegtuigAantalStewards, "
				+      "vli.AantalZetelsPerRij AS VliegtuigAantalZetels, "
				+      "vli.AantalRijenBusiness AS VliegtuigAantalRijenBusiness, "
				+      "vli.AantalRijenEcon AS VliegtuigAantalRijenEconomy, "
				+      "ei.EigenaarId AS EigenaarId, "
				+      "ei.EigenaarsType AS EigenaarType, "
				+      "ei.AdresId AS EigenaarAdresId, "
				+      "ei.PersoonId AS EigenaarPersoonId, "
				+      "ei.MaatschappijNaam AS EigenaarMaatschappijNaam, "
				+      "pe.Naam AS EigenaarPersoonNaam, "
				+      "pe.Voornaam AS EigenaarPersoonVoornaam, "
				+      "pe.Geboortedatum AS EigenaarPersoonGeboortedatum "
				+    "FROM Vlucht vl INNER JOIN Luchthaven lu1 ON (vl.VertrekLuchthavenId = lu1.LuchthavenId) "
				+                   "INNER JOIN Luchthaven lu2 ON (vl.AankomstLuchthavenId = lu2.LuchthavenId) "
				+                   "INNER JOIN Vliegtuig vli ON (vl.VliegtuigId = vli.VliegtuigId) "
				+                   "INNER JOIN Eigenaar ei ON (vli.EigenaarId = ei.EigenaarId) "
				+                   "LEFT OUTER JOIN Persoon pe ON (ei.PersoonId = pe.PersoonId) "
				+    "WHERE vl.VluchtId = ?";
		
		try {
			PreparedStatement statement = ConnectionService.getConnection().prepareStatement(sql);
			statement.setInt(1, vluchtId);
			
			ResultSet rs = statement.executeQuery();
			
			if (rs.next()) {
				vertrekLuchthaven = new Luchthaven(
						rs.getInt("VertrekLuchthavenId"),
						rs.getString("VertrekLuchthavenCode"),
						rs.getString("VertrekLuchthavenNaam"),
						null);

				aankomstLuchthaven = new Luchthaven(
						rs.getInt("AankomstLuchthavenId"),
						rs.getString("AankomstLuchthavenCode"),
						rs.getString("AankomstLuchthavenNaam"),
						null);
				
				if (rs.getString("EigenaarType").equals("P")) {
					persoon = new Persoon(
							rs.getInt("EigenaarPersoonId"),
							rs.getString("EigenaarPersoonVoornaam"),
							rs.getString("EigenaarPersoonNaam"),
							null,
							rs.getString("EigenaarPersoonGeboortedatum"));
				}
				
				eigenaar = new Eigenaar(
						rs.getInt("EigenaarId"),
						rs.getString("EigenaarType"),
						rs.getInt("EigenaarAdresId"),
						rs.getString("EigenaarMaatschappijNaam"),
						persoon);
				
				vliegtuig = new Vliegtuig(
						rs.getInt("VliegtuigId"),
						rs.getString("VliegtuigModel"),
						rs.getString("VliegtuigType"),
						eigenaar,
						rs.getInt("VliegtuigAantalPiloten"),
						rs.getInt("VliegtuigAantalStewards"),
						rs.getInt("VliegtuigAantalZetels"),
						rs.getInt("VliegtuigAantalRijenBusiness"),
						rs.getInt("VliegtuigAantalRijenEconomy"));
				
				vlucht = new Vlucht(
						vluchtId,
						vliegtuig,
						vertrekLuchthaven,
						aankomstLuchthaven,
						rs.getString("VluchtNummer"),
						rs.getString("VluchtVertrekTijd"),
						rs.getString("VluchtAankomstTijd"),
						rs.getDouble("VluchtPrijsEconomy"),
						rs.getDouble("VluchtPrijsBusiness"),
						rs.getInt("VluchtGate"),
						rs.getString("VluchtStatus"));
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		}
		
		return vlucht;
	}
	
	public static boolean updateVlucht(int vluchtId, int vliegtuigId, int vertrekLuchthavenId, int aankomstLuchthavenId, 
			String vluchtNr, String vertrekTijd, String aankomstTijd, double prijsEconomy, double prijsBusiness, 
			int gate, String vluchtStatus) {
		String sql = "UPDATE Vlucht "
				+    "SET VliegtuigId = ?, "
				+        "VertrekLuchthavenId = ?, "
				+        "AankomstLuchthavenId = ?, "
				+        "VluchtNr = ?, "
				+        "Vertrektijd = ?, "
				+        "Aankomsttijd = ?, "
				+        "PrijsEconomy = ?, "
				+        "PrijsBusiness = ?, "
				+        "Gate = ?, "
				+        "VluchtStatus = ? "
				+    "WHERE VluchtId = ?";
		int result = 0;
		
		try {
			PreparedStatement statement = ConnectionService.getConnection().prepareStatement(sql);
			statement.setInt(1, vliegtuigId);
			statement.setInt(2, vertrekLuchthavenId);
			statement.setInt(3, aankomstLuchthavenId);
			statement.setString(4, vluchtNr);
			statement.setString(5, vertrekTijd);
			statement.setString(6, aankomstTijd);
			statement.setDouble(7, prijsEconomy);
			statement.setDouble(8, prijsBusiness);
			statement.setInt(9, gate);
			statement.setString(10, vluchtStatus);
			statement.setInt(11, vluchtId);
			
			result = statement.executeUpdate();
		} catch(SQLException ex) {
			ex.printStackTrace();
		}
		
		return (result == 1);
	}
}
